package com.toomoss.USB2XXX;

import com.sun.jna.Native;
import com.sun.jna.Structure;

import java.util.Arrays;
import java.util.List;

public interface LIN_UDS {
    LIN_UDS INSTANCE  = (LIN_UDS) Native.loadLibrary("USB2XXX",LIN_UDS.class);
    //函数调用出错后返回值定义
    public static int LIN_UDS_OK           = 0;     ///<函数执行成功
    public static int LIN_UDS_TRAN_USB     = -98;   ///<USB数据传输错误
    public static int LIN_UDS_TRAN_LIN     = -99;   ///<LIN总线数据传输错误，一般是LIN总线异常
    public static int LIN_UDS_TIMEOUT_A    = -100;  ///<超时错误
    public static int LIN_UDS_TIMEOUT_Bs   = -101;  ///<超时错误
    public static int LIN_UDS_TIMEOUT_Cr   = -102;  ///<超时错误
    public static int LIN_UDS_WRONG_SN     = -103;  ///<错误的SN
    public static int LIN_UDS_INVALID_FS   = -104;  ///<首帧数据错误
    public static int LIN_UDS_UNEXP_PDU    = -105;  ///<数据不符合UDS协议
    public static int LIN_UDS_WFT_OVRN     = -106;  ///<数据格式错误
    public static int LIN_UDS_BUFFER_OVFLW = -107;  ///<缓冲区溢出错误
    public static int LIN_UDS_ERROR        = -108 ; ///<其他错误
    //LIN UDS地址结构体定义
    public class LIN_UDS_ADDR  extends Structure {
        public static class ByReference extends LIN_UDS.LIN_UDS_ADDR implements Structure.ByReference {}
        public static class ByValue extends LIN_UDS.LIN_UDS_ADDR implements Structure.ByValue {}

        @Override
        protected List getFieldOrder() {
            // TODO Auto-generated method stub
            return Arrays.asList(new String[]{"ReqID","ResID","NAD","CheckType","STmin"});
        }

        public byte ReqID;	    //请求报文ID，一般为0x3C
        public byte ResID;	    //应答报文ID，一般为0x3D
        public byte NAD;	    //节点地址，0x7F为广播地址
        public byte	CheckType;  //<0-标准，1-增强，一般为标准校验
        public byte	STmin;	    //连续帧时间间隔，单位为毫秒
    }
    /**
     * @brief  发送UDS请求数据
     * @param  DevHandle 设备号，通过调用 @ref USB_ScanDevice 获取
     * @param  LINIndex LIN通道号，0-LIN1，1-LIN2，2-LIN3，3-LIN4
     * @param[in]  pUDSAddr UDS地址结构体指针
     * @param[in]  pReqData 请求数据指针，一般为服务ID，子服务ID，参数
     * @param  DataLen 请求数据字节数，若数据字节数大于单帧能发送的最大字节数，则底层自动分为多帧传输
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LIN_UDS_Request(int DevHandle,byte LINIndex,LIN_UDS_ADDR pUDSAddr,byte[] pReqData,int DataLen);

    /**
     * @brief  获取UDS响应数据
     * @param  DevHandle 设备号，通过调用 @ref USB_ScanDevice 获取
     * @param  LINIndex LIN通道号，0-LIN1，1-LIN2，2-LIN3，3-LIN4
     * @param[in]  pUDSAddr UDS地址结构体指针
     * @param[out]  pResData 存储响应数据的缓冲区指针
     * @param  TimeOutMs 等待数据超时时间，单位为毫秒
     * @return 函数执行状态
     * @retval >0 读取到的响应数据字节数
     * @retval =0 没有读取到响应数据
     * @retval <0 函数调用失败
     */
    int LIN_UDS_Response(int DevHandle,byte LINIndex,LIN_UDS_ADDR pUDSAddr,byte[] pResData,int TimeOutMs);

    /**
     * @brief  获取LIN UDS收发原始帧
     * @param  DevHandle 设备号，通过调用 @ref USB_ScanDevice 获取
     * @param  LINIndex LIN通道号，0-LIN1，1-LIN2，2-LIN3，3-LIN4
     * @param  pLINMsg 存储LIN消息的数据缓冲区指针
     * @param  BufferSize 缓冲区大小
     * @return 函数执行状态
     * @retval >0 读取到的LIN消息帧数
     * @retval =0 没有读取到LIN消息
     * @retval <0 函数调用失败
     */
    int LIN_UDS_GetMsgFromUDSBuffer(int DevHandle,byte LINIndex,USB2LIN_EX.LIN_EX_MSG[] pLINMsg,int BufferSize);
}
